/**
 * @author 陈泰来
 * @version V1.0
 * @Project echo-java-base
 * @Title hashmap探讨
 * @Description *
 * @Package base.collections.hashmap
 * @date 2020/10/4 12:48 下午
 * @Copyright:学如逆水行舟，不进则退 .
 */
package base.collections.hashmap;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class NewHashMap {

    /**
     * HashMap的最大容量，如果指定容量超过这个值，则将容量直接设置为这个值。
     * 由构造函数执行
     * 必须是2的次幂，小于等于 1<<30  即 2^30
     */
    static final int MAXIMUM_CAPACITY = 1 << 30;

    public static void main(String[] args) {
//        System.out.println("test".hashCode());
//        System.out.println(Objects.hashCode("test"));
        System.out.println(tableSizeFor(6));

        //创建一个同步的HashMap  初始容量 i 负载因子 v
        Map<Integer, String> syncMap = Collections.synchronizedMap(new HashMap<>(16, 0.75f));
        for (int i = 0; i < 1000; i++) {
            int finalI = i;
            Thread thread = new Thread(() -> syncMap.put(finalI, "item" + finalI));
            thread.start();
        }

        while (Thread.activeCount() > 1) Thread.yield();


        System.out.println(syncMap.size());
    }


    /**
     * 根据传入的容量，返回一个2的次幂的数组长度。
     * Returns a power of two size for the given target capacity.
     */
    static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

}
